package com.yd.sdk;

import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import dalvik.system.DexFile;

public class Utils {

    public static ArrayList<Class> getAllClassByInterface(Class clazz, String packagePath, String packageName) {
        ArrayList<Class> list = new ArrayList<>();
        // 判断是否是一个接口
        if (clazz.isInterface()) {
            try {
                ArrayList<Class> allClass = getAllClass(packagePath, packageName);
                /**
                 * 循环判断路径下的所有类是否实现了指定的接口 并且排除接口类自己
                 */
                for (int i = 0; i < allClass.size(); i++) {
                    /**
                     * 判断是不是同一个接口
                     */
                    if (clazz.isAssignableFrom(allClass.get(i))) {
                        if (!clazz.equals(allClass.get(i))) {
                            // 自身并不加进去
                            list.add(allClass.get(i));
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("出现异常");
            }
        }
        return list;
    }
    /**
     * 从一个指定路径下查找所有的类
     *
     * @param packageName
     * @param packagePath
     */
    private static ArrayList<Class> getAllClass(String packagePath, String packageName) {
        ArrayList<Class> list = new ArrayList<>();
        try {
            DexFile df = new DexFile(packagePath);//通过DexFile查找当前的APK中可执行文件
            Enumeration<String> enumeration = df.entries();
            while (enumeration.hasMoreElements()) {
                String className = enumeration.nextElement();
                if (className.contains(packageName)) {//在当前所有可执行的类里面查找包含有该包名的所有类
                    Class clazz = Class.forName(className);
                    list.add(clazz);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (ExceptionInInitializerError e) {
            e.printStackTrace();
        }
        return list;
    }


    public static List<Class> getAllClassName(String packagePath){
        List<Class> classNameList = new ArrayList<Class>();

        DexFile df = null;//通过DexFile查找当前的APK中可执行文件
        try {
            df = new DexFile(packagePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(df != null)
        {
            Enumeration<String> enumeration = df.entries();//获取df中的元素  这里包含了所有可执行的类名 该类名包含了包名+类名的方式
            while (enumeration.hasMoreElements()) {//遍历
                String className = (String) enumeration.nextElement();
//                if (className.contains("com.google") || className.contains("android.support") || className.contains("javassist.bytecode")
//                        || className.contains("android") || className.contains("androidx") || className.contains("com.blankj") ||
//                        className.contains("javassist") || className.contains("kotlin") || className.contains("$") ||
//                        className.contains("org.reflections") || className.contains("org.intellij") ||
//                        className.contains("org.jetbrains") ||
//                        className.contains("com.unity3d") ||
//                        className.contains("jnibridge") ||
//                        className.contains(".BuildConfig") ||
//                        className.contains(".R") ||
//                        className.contains("org.fmod")
//
//                    ) {
//                    continue;
//                }
                if(!className.contains("com.yd"))continue;

                Class clazz = null;
                try {
//                    Log.e("Utils===>",className);
                    clazz = Class.forName(className);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (ExceptionInInitializerError e)
                {
                    e.printStackTrace();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }finally {

                }
                if(clazz!=null)classNameList.add(clazz);
            }
        }



        return classNameList;
    }

    public static List<Class> getClassName(String packagePath,String packageName) {
        List<Class> classNameList = new ArrayList<Class>();
        try {

            DexFile df = new DexFile(packagePath);//通过DexFile查找当前的APK中可执行文件
            Enumeration<String> enumeration = df.entries();//获取df中的元素  这里包含了所有可执行的类名 该类名包含了包名+类名的方式
            while (enumeration.hasMoreElements()) {//遍历
                String className = (String) enumeration.nextElement();

                if (className.contains(packageName)) {//在当前所有可执行的类里面查找包含有该包名的所有类
                    Class clazz = Class.forName(className);
                    classNameList.add(clazz);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return classNameList;
    }


}
